/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-通用能力封装层-执行http网络请求
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.http.handler.impl;

import cn.hutool.http.ContentType;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.taipingframework.utility.http.constant.TimeoutEnum;
import com.taipingframework.http.handler.HttpRequestHandler;
import com.taipingframework.http.handler.IHttpRequestHandler;
import com.taipingframework.utility.http.ServiceConfigInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;

/**
 * HTTP POST 请求 处理器
 */
@Component("POST")
public final class PostHandler extends HttpRequestHandler implements IHttpRequestHandler {

    @Override
    public HttpRequest executeHttpRequest(ServiceConfigInfo serviceConfigInfo) {
        // POST请求需要判断content-type，即提交方式：FORM表单 或 JSON报文 或 URL参数
        if (MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.serviceRequestConfigInfo.getContentType())) {
            super.jsonBody = StringUtils.isNotBlank(super.jsonBody) ? super.jsonBody : "{}";
            super.response.setRequestBodyJson(super.jsonBody);

            // 构造HTTP POST JSON请求
            return HttpRequest
                    .post(super.requestUrl)
                    .contentType(ContentType.JSON.getValue())
                    .headerMap(super.requestHeaderMap, true)
                    .body(super.jsonBody)
                    .timeout(TimeoutEnum.WEB_SERVICE_TIMEOUT.getTimeout());
        } else if (MediaType.APPLICATION_FORM_URLENCODED_VALUE.equalsIgnoreCase(super.serviceRequestConfigInfo.getContentType())) {
            super.response.setRequestBodyJson(JSONUtil.toJsonStr(super.requestFormMap));

            // 10 发送HTTP POST Form请求
            return HttpRequest
                    .post(super.requestUrl)
                    .contentType(ContentType.FORM_URLENCODED.getValue())
                    .headerMap(super.requestHeaderMap, true)
                    .form(super.requestFormMap)
                    .timeout(TimeoutEnum.WEB_SERVICE_TIMEOUT.getTimeout());
        }

        throw new RuntimeException("未处理的Content-Type：" + super.serviceRequestConfigInfo.getContentType());
    }

}
